'use strict';
const bcrypt = require('bcryptjs');
const e = require('express');
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      models.User.hasMany(models.Course,{as:'courses'})
      models.User.belongsToMany(models.Course,{through:models.Like,foreignKey:'userId',as:'likeCourses'})
    }
  }
  User.init({
    email: {
      type:DataTypes.STRING,
      allowNull:false,
      validate:{
        notNull:{msg:'邮箱必须填写'},
        notEmpty:{msg:'邮箱不能为空'},
        isEmail:{msg:'邮箱格式不正确'},
        // 自定义验证，保证邮箱唯一性
        async isUnique(value){
          const user = await User.findOne({where:{email:value}})
          if(user){
            throw new Error('邮箱已存在')
          }
        }
      }
    },
    username: {
      type:DataTypes.STRING,
      allowNull:false,
      validate:{
        notNull:{msg:'用户名必须填写'},
        notEmpty:{msg:'用户名不能为空'},
        len:{args:[2,45],msg:'用户名长度必须在2-45个字符之间'},
        async isUnique(value){
          const user = await User.findOne({where:{username:value}})
          if(user){
            throw new Error('用户名已存在')
          }
        }
      }
    },
    password: {
      type:DataTypes.STRING,
      allowNull:false,
      validate:{
        notNull:{msg:'密码必须填写'},
        notEmpty:{msg:'密码不能为空'},
        // 对密码加密后长度就与用户输入的密码长度不一致了，所以不可以使用默认的长度验证
        // len:{args:[5,45],msg:'密码长度必须在5-45个字符之间'},
        set(value){//sequelize自带的方法，作用与类的set方法类似
          if(value.length>= 5 && value.length<= 45 ){
            // 同步加密密码，10为加密的盐(加密的原理为在密码中随机放入几个随机字符，10为盐(随机字符)的数量)
            this.setDataValue('password',bcrypt.hashSync(value,10))
          }else{
            throw new Error('密码长度必须在5-45个字符之间')
          }
        }
      }
    },
    nickname: {
      type:DataTypes.STRING,
      allowNull:false,
      validate:{
        notNull:{msg:'昵称必须填写'},
        notEmpty:{msg:'昵称不能为空'},
        len:{args:[2,45],msg:'昵称长度必须在2-45个字符之间'}
      }
    },
    sex: {
      type:DataTypes.TINYINT,
      allowNull:false,
      validata:{
        notNull:{msg:'性别必须填写'},
        notEmpty:{msg:'性别不能为空'},
        isIn:{args:[[0,1,2]],msg:'性别的值必须是0(男性),1(女性),2(未选择)'}
      }
    },
    company: DataTypes.STRING,
    introduce: DataTypes.TEXT,
    role: {
      type:DataTypes.TINYINT,
      allowNull:false,
      validate:{
        notNull:{msg:'用户组必须选择'},
        notEmpty:{msg:'用户组不能为空'},
        isIn:{args:[[0,100]],msg:'用户组的值要是0(普通用户)或者100(管理员)'}
      }
    },
    avatar:{
      type:DataTypes.STRING,
      validate:{
        isUrl:{msg:'图片地址不正确'}
      }
    }
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};